/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.hochschild.sgv.servlet;

import com.hochschild.sgv.domain.Correo;
import com.hochschild.sgv.domain.Solicitud;
import com.hochschild.sgv.service.EquipoManager;
import com.hochschild.sgv.service.implementacion.SimpleEquipoManager;
import com.hochschild.sgv.util.ConexionBD;
import com.hochschild.sgv.util.ConexionBDSeg;
import com.hochschild.sgv.util.Constantes;
import com.hochschild.sgv.util.EnviarCorreo;
import com.hochschild.sgv.util.FechaUtil;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 *
 * @author Christian Alexander Morales Vargas (cmorales.corporacion@gmail.com)
 */
public class Demonio extends HttpServlet {


  
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException, SQLException {
        response.setContentType("text/html;ISO-8859-1");
        PrintWriter out = response.getWriter();
         out.println("<html>");
        out.println("<head>");
        out.println("<title>Agenda gonzasilve</title>");  
        out.println("</head>");
        out.println("</html>");
        ResultSet rst = null;
        int cantdiasAntes = 0;

        try {
            Date fechaNow = new Date();
                System.out.println("fechaNow: " + fechaNow);
            cantdiasAntes = Integer.parseInt(obtenerConfiguracionCorreo("CANTDIASDEMONIO"));
            Date fechaABsucar = FechaUtil.sumarCantDiasAFecha(fechaNow, cantdiasAntes);
                System.out.println("fechaABsucar: " + fechaABsucar + " cantdiasAntes: " + cantdiasAntes );
             
            rst = new ConexionBD().ExecuteSelect(consultarSolicitud(fechaABsucar), "Demonio");
             List<Correo> lstCorreo =  listarColaboradores(rst);
             
                try {
                    enviarCorreos(lstCorreo);
                } catch (Exception ex) {
                    Logger.getLogger(Demonio.class.getName()).log(Level.SEVERE, null, ex);
                }
            
            }catch (SQLException e) {
                e.printStackTrace();
            } 
            finally {            
                out.close();
            }
    }

    private String consultarSolicitud(Date fechaABsucar){
    StringBuilder sql = new StringBuilder();
            
            sql.append("select ");
            sql.append("[Solicitud].[idSolicitud], ");
            sql.append("[Solicitud].[diasHabiles], ");
            sql.append("[Solicitud].[fechaInicio], ");
            sql.append("[Solicitud].[fechaFin], ");
            sql.append("[Solicitud].[idUsuarioSolicitante], ");
            sql.append("[Solicitud].[idUsuarioAprobador], ");
            sql.append("[Solicitud].[tipoSolicitud] ");
            sql.append("from  ");
            sql.append("[dbo].[Solicitud] [Solicitud]  "); 
            sql.append("where ");
            sql.append("([Solicitud].[fechaInicio] ='");
            sql.append(FechaUtil.formatToDate(fechaABsucar, "MM-dd-yyyy") );//Formato mm-dd-yyyy
            sql.append("') and ([Solicitud].[tipoSolicitud] ='");
            sql.append(Constantes.SOLICITUD_PLANIFICADA);
            sql.append("') ORDER BY  [Solicitud].[idUsuarioSolicitante]");
    
            return sql.toString();
    }
    
     private String consultarUsuario(String idUsuario){
    StringBuilder sql = new StringBuilder();
            
            sql.append("select ");
            sql.append("[PuestoPorUsuario].[idUsuario], ");
            sql.append("[PuestoPorUsuario].[divisionUsuario], ");
            sql.append("[PuestoPorUsuario].[subDivisionUsuario], ");
            sql.append("[PuestoPorUsuario].[nombreUsuario], ");
            sql.append("[PuestoPorUsuario].[apellidoUsuario], ");
            sql.append("[PuestoPorUsuario].[correoUsuario]  ");
            sql.append("from  ");
            sql.append(" [dbo].[PuestoPorUsuario] [PuestoPorUsuario]   "); 
            sql.append("where ");
            sql.append("([PuestoPorUsuario].[idUsuario] ='");
            sql.append(idUsuario );
            sql.append("')");
    
    
            return sql.toString();
    }
      private String consultarJefe(String idPuesto){
    StringBuilder sql = new StringBuilder();
            
            sql.append("select ");
            sql.append("[PuestoPorUsuario].[idUsuario], ");
            sql.append("[PuestoPorUsuario].[correoUsuario]  ");
            sql.append("from  ");
            sql.append(" [dbo].[PuestoPorUsuario] [PuestoPorUsuario]   "); 
            sql.append("where ");
            sql.append("([PuestoPorUsuario].[idPuesto] ='");
            sql.append(idPuesto );
            sql.append("')");
    
    
            return sql.toString();
    }
      
    private List<Correo> listarColaboradores(ResultSet rst) throws SQLException{
        System.out.println("listarColaboradores");
        Correo correo = null;
        List<Correo> lstCorreo =  new ArrayList<Correo>();
        String division = "";
        String subdivision = "";
        SimpleEquipoManager equipo = new SimpleEquipoManager();
        ResultSet rstUsuario;
        boolean tabla = false;
        while (rst.next()) {
                        tabla = true;
                        correo = new Correo();
                        rstUsuario = new ConexionBDSeg().ExecuteSelect(consultarUsuario(rst.getString("idUsuarioSolicitante")), "Demonio");
                        if (rstUsuario.next()) {
                            correo.setNombreColaborador(rstUsuario.getString("nombreUsuario"));
                            correo.setApellidoColaborador(rstUsuario.getString("apellidoUsuario"));
                            correo.setCorreoColaborador(rstUsuario.getString("correoUsuario"));
                            division = rstUsuario.getString("divisionUsuario");
                            correo.setDivision(division);
                            subdivision = rstUsuario.getString("subDivisionUsuario");
                            correo.setSubDivision(subdivision);
                            subdivision = equipo.consultarSubDivision(division, subdivision);
                            correo.setSubdivision(subdivision);
                        }
                        
                        correo.setFechaInicio(rst.getDate("fechaInicio"));
                        correo.setFechaFin(rst.getDate("fechaFin"));
                        
                        correo.setIdUsuarioAprobador(rst.getString("idUsuarioAprobador"));
                        rstUsuario = new ConexionBDSeg().ExecuteSelect(consultarJefe(rst.getString("idUsuarioAprobador")), "Demonio");
                        if (rstUsuario.next()) {
                            correo.setCorreoJefe(rstUsuario.getString("correoUsuario"));
                        }
                        //System.out.println("solicitud: " + solicitud.getIdUsuarioSolicitante());
                        lstCorreo.add(correo);
                }
                    if (tabla)
                        System.out.println("************** Hay Solicitudes para enviar **********************");
                    else
                        System.out.println("************** NO Hay Solicitudes para enviar *******************");
                    
                return lstCorreo;
    }
    
    private String obtenerConfiguracionCorreo(String abreviatura) throws SQLException{
        ResultSet rst = null;
        StringBuilder sql = new StringBuilder();
        String result="";
        sql.append("Select  descripcion from CatalogoDetalle WHERE abreviatura ='");
        sql.append(abreviatura);
        sql.append("'");
        rst = new ConexionBD().ExecuteSelect(sql.toString(), "Demonio");
        if (rst.next()) {
                result = rst.getString(1);
            }
        System.out.println("Result: " + result);
        return result;
    }
    
    private void enviarCorreos(List<Correo> lstCorreo) throws Exception{
        EnviarCorreo enviaCorreo = new EnviarCorreo(obtenerConfiguracionCorreo( Constantes.SERVIDOR_CORREO), obtenerConfiguracionCorreo(Constantes.ALIAS_MAIL_CORREO), obtenerConfiguracionCorreo(Constantes.ALIAS_MAIL_RRHH));
        Correo correo;
        Iterator i =lstCorreo.iterator();
        String mensajeCorreo = "", mensaje = "";
        String fechaIni ="";
        String FechaFin = "";
        
                while (i.hasNext()) {
                    correo =(Correo) i.next();
                    System.out.println("Nombre: " + correo.getNombreColaborador().trim() + " Apellido: "+ correo.getApellidoColaborador() +  " Subdivision: " + correo.getSubdivision() + " Fecha Inicio: " + correo.getFechaInicio() + " Fecha Fin: " + correo.getFechaFin() + " correo Colaborador: " + correo.getCorreoColaborador() + " Aprobador: " + correo.getIdUsuarioAprobador() + " CorreoAprobador: " + correo.getCorreoJefe());
                    fechaIni = FechaUtil.formatoYYYYMMDD_DDMMYYYY(correo.getFechaInicio());
                    FechaFin = FechaUtil.formatoYYYYMMDD_DDMMYYYY(correo.getFechaFin());
                    mensajeCorreo = enviaCorreo.avisarColaboradorVacacionesPlanificadas(fechaIni, FechaFin, correo.getCorreoColaborador());
                    mensajeCorreo = enviaCorreo.avisarJefeVacacionesPlanificadas(fechaIni, FechaFin, correo.getCorreoJefe(), correo.getNombreColaborador().trim(), correo.getApellidoColaborador().trim(), correo.getSubdivision());
                    
                    mensajeCorreo = enviarCorreosAnalista(enviaCorreo, correo.getDivision(), fechaIni, FechaFin, correo.getNombreColaborador().trim(), correo.getApellidoColaborador().trim(), correo.getSubdivision());
                    if (mensajeCorreo.equals("1")) {
                        mensaje += "se realizó con éxito ";
                    } else {
                        mensaje += "no se realizó con éxito por el siguiente error \n";
                        mensaje += mensajeCorreo;
                    }
                    System.out.println("mensaje: " + mensaje);
                }        
    }

    private String enviarCorreosAnalista(EnviarCorreo enviaCorreo, String division, String FechaInicio , String FechaFin, String nombreColaborador, String apellidoColaborador, String area) throws Exception{
        String mensajeCorreo ="";
        SimpleEquipoManager equipo = new SimpleEquipoManager();
        String[] correoAnalistas = equipo.listarAnalistas(division);
        for (int i = 0; i < correoAnalistas.length; i++) {
            mensajeCorreo = enviaCorreo.avisarAnalistaVacacionesPlanificadas(FechaInicio, FechaFin, correoAnalistas[i], nombreColaborador, apellidoColaborador, area);
        }
        System.out.println("enviarCorreosAnalista");
        return mensajeCorreo;
        
    }
    
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        try {
            processRequest(request, response);
        } catch (SQLException ex) {
            Logger.getLogger(Demonio.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    /** 
     * Handles the HTTP <code>POST</code> method.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        try {
            processRequest(request, response);
        } catch (SQLException ex) {
            Logger.getLogger(Demonio.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    /** 
     * Returns a short description of the servlet.
     * @return a String containing servlet description
     */
    @Override
    public String getServletInfo() {
        return "Short description";
    }// </editor-fold>
}
